package likou.tanxin;

import java.util.*;

/**
 * @author: Tangxz
 * @email:1171702529@qq.com
 * @cate: 2020/11/03 06:07
 */
//字符串 S 由小写字母组成。
// 我们要把这个字符串划分为尽可能多的片段，同一字母最多出现在一个片段中。
// 返回一个表示每个字符串片段的长度的列表。
public class _763 {
    public static List<Integer> partitionLabels(String S) {
        List<int[]> list = new ArrayList<>();
        Map<Integer, int[]> map = new HashMap<>();
        byte[] bytes = S.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            int nowB = bytes[i];
            if (map.containsKey(nowB)) {
                int[] now = map.get(nowB);
                now[1] = i;
                map.put(nowB, now);
            } else {
                int[] now = new int[2];
                now[0] = i;
                map.put(nowB, now);
            }
        }
        Set<Integer> set = map.keySet();
        for (Integer key : set) {
            list.add(map.get(key));
        }
        list.sort(Comparator.comparingInt((int[] i) -> i[0]));
        int nowF = list.get(0)[0], nowL = list.get(0)[1];
        List<Integer> daan = new ArrayList<>();
        boolean p = false;
        for (int i = 1; i < list.size(); i++) {
            if (list.get(i)[0] > nowL) {
                daan.add((nowL - nowF + 1)>0?(nowL - nowF + 1):1);
                nowL = list.get(i)[1];
                nowF = list.get(i)[0];
            } else if (list.get(i)[1] > nowL) {
                nowL = list.get(i)[1];
            }
            System.out.println(list.get(i)[0] + " " + list.get(i)[1]);
        }
        daan.add((nowL - nowF + 1)>0?(nowL - nowF + 1):1);
        return daan;
    }

    //执行用时： 2 ms , 在所有 Java 提交中击败了 99.90% 的用户
    //内存消耗： 36.6 MB , 在所有 Java 提交中击败了 99.84% 的用户
    public List<Integer> partitionLabels2(String S) {
        if (null == S || 0 == S.length()) {
            return null;
        }
        int len = S.length();

        // 做映射表，记录每个字母最后出现的位置
        int[] ma = new int[26];
        for (int i = 0; i < len; ++i) {
            ma[S.charAt(i) - 'a'] = i;
        }

        List<Integer> ans = new ArrayList<>();
        int left = 0;
        while (left < len) {
            char curLeft = S.charAt(left);
            // 最小右边界
            int right = ma[curLeft - 'a'];
            for (int i = left + 1; i < right; ++i) {
                // 枚举当前分段中的字符，更新右边界
                if (ma[S.charAt(i) - 'a'] > right) {
                    right = ma[S.charAt(i) - 'a'];
                }
            }
            // 至此，一个新的片段生成了
            ans.add(right - left + 1);
            // 分析下一段
            left = right + 1;
        }
        return ans;
    }
    public static void main(String[] args) {
        System.out.println(partitionLabels("eaaaabaaec"));
    }
}
